﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.ComponentModel.DataAnnotations;
using System.Web;

namespace SGCC.Models
{
    public class FuncionarioModel
    {
        public int Id { get; set; }

        [Display(Name = "Nome* ")]
        [Required(ErrorMessage = " Campo obrigatório.")]
        [StringLength(250, ErrorMessage="Campo deve ter no maximo 250 caracteres.")]
        public String nome { get; set; }
        
        [Display(Name = "Data de Nascimento* ")]
        [DisplayFormat(DataFormatString="{0:dd/MM/yyyy}",NullDisplayText="dd/MM/aaaa", ApplyFormatInEditMode=true)]
        [Required(ErrorMessage = " Campo obrigatório.")]
        public DateTime dataNasc { get; set; }

        [Display(Name = "Telefone* ")]
        [Required(ErrorMessage = " Campo obrigatório.")]
        public String telefone { get; set; }

        [Display(Name = "CPF* ")]
        [DisplayFormat(DataFormatString = "{000.000.000-00}", ApplyFormatInEditMode = true)]
        [Required(ErrorMessage = " Campo obrigatório.")]
        public String cpf { get; set; }

        [Display(Name = "Especialidade* ")]
        [Required(ErrorMessage = " Campo obrigatório.")]
        public Int32 especialidadeId { get; set; }

        [Display(Name = "Logradouro* ")]
        [Required(ErrorMessage = " Campo obrigatório.")]
        [StringLength(250, ErrorMessage = "Campo deve ter no maximo 250 caracteres.")]
        public String logradouro { get; set; }

        [Display(Name = "Cidade* ")]
        [Required(ErrorMessage = " Campo obrigatório.")]
        public Int32 cidadeId { get; set; }

        [Display(Name = "Estado* ")]
        [Required(ErrorMessage = " Campo obrigatório.")]
        public Int32 estadoId { get; set; }
        
        [Display(Name = "Cidade* ")]
        public String cidade { get; set; }
        public String estado { get; set; }
        
        [Display(Name = "Especialidade* ")]
        public String especialidade { get; set; }

        public FuncionarioModel()
        {

        }
        public FuncionarioModel(Funcionario pFuncionario)
        {
            Id = pFuncionario.FuncionarioId;
            nome = pFuncionario.Nome;
            cpf = pFuncionario.CPF;
            especialidadeId = pFuncionario.EspecialidadeId;
            especialidade = pFuncionario.Especialidade.Nome;
            cidadeId = pFuncionario.CidadeId;
            cidade = pFuncionario.Cidade.Nome;
            estadoId = pFuncionario.EstadoId;
            estado = pFuncionario.Estado.Sigla;
            logradouro = pFuncionario.Logradouro;
            dataNasc = pFuncionario.DataNasc;
            telefone = pFuncionario.Telefone;
        }

        public void AtualizarFuncionario()
        {
            
        }
        public void AdicionarFuncionario(FuncionarioModel funcionario)
        {
            Funcionario f = new Funcionario();
            f.Nome = funcionario.nome;
            f.Telefone = funcionario.telefone;
            f.CPF = funcionario.cpf;
            f.DataNasc = funcionario.dataNasc;
            f.CidadeId = funcionario.cidadeId;
            f.EstadoId = funcionario.estadoId;
            f.EspecialidadeId = funcionario.especialidadeId;
            f.Logradouro = funcionario.logradouro;
            f.Ativo = "S";
            
            using (DBContext db = new DBContext())
            {
                db.Funcionario.Add(f);
                db.SaveChanges();
            }

        }
        public void ExcluirFuncionario(){}

        public List<FuncionarioConsulta> ListarFuncionarios()
        {
            using (DBContext db = new DBContext())
            {
                var funcionarios = (from f in db.Funcionario
                                   join e in db.Especialidade on f.EspecialidadeId equals e.EspecialidadeId
                                   join c in db.Cidade on f.CidadeId equals c.CidadeId
                                   join uf in db.Estado on f.EstadoId equals uf.EstadoId
                                   where (f.Ativo == "S")
                                   orderby f.Nome ascending
                                   select new { f, e, c, uf }).ToList();

                List<FuncionarioConsulta> ListaFuncionarios = new List<FuncionarioConsulta>();

                for (int i = 0; i < funcionarios.Count; i++)
                {
                    ListaFuncionarios.Add(new FuncionarioConsulta()
                    {
                        Id = funcionarios[i].f.FuncionarioId,
                        Nome = funcionarios[i].f.Nome,
                        CPF = funcionarios[i].f.CPF,
                        Especialidade = funcionarios[i].e.Nome,
                        Cidade = funcionarios[i].c.Nome,
                        //estado = funcionarios[i].uf.Sigla,
                        DataNasc = (DateTime) funcionarios[i].f.DataNasc,
                        Telefone = funcionarios[i].f.Telefone
                    });
                }

                return ListaFuncionarios;
            }
        }

        public List<FuncionarioModel> BuscarFuncionario(FuncionarioModel funcionario)
        {
            using (DBContext db = new DBContext())
            {
                var funcionarios = (from f in db.Funcionario
                                    join e in db.Especialidade on f.EspecialidadeId equals e.EspecialidadeId
                                    join c in db.Cidade on f.CidadeId equals c.CidadeId
                                    join uf in db.Estado on f.EstadoId equals uf.EstadoId
                                    where (f.Ativo == "S"
                                        || f.Nome.Equals(funcionario.nome)
                                        || f.CPF.Equals( funcionario.cpf)
                                        || f.EspecialidadeId.Equals( funcionario.especialidadeId)
                                        || f.CidadeId.Equals( funcionario.cidadeId)
                                        || f.EstadoId.Equals( funcionario.estadoId) )
                                    orderby f.Nome ascending
                                    select new { f, e, c, uf }).ToList();

                List<FuncionarioModel> ListaFuncionarios = new List<FuncionarioModel>();

                for (int i = 0; i < funcionarios.Count; i++)
                {
                    ListaFuncionarios.Add(new FuncionarioModel()
                    {
                        Id = funcionarios[i].f.FuncionarioId,
                        nome = funcionarios[i].f.Nome,
                        cpf = funcionarios[i].f.CPF,
                        especialidade = funcionarios[i].e.Nome,
                        cidade = funcionarios[i].c.Nome,
                        estado = funcionarios[i].uf.Sigla,
                        dataNasc = (DateTime)funcionarios[i].f.DataNasc,
                        telefone = funcionarios[i].f.Telefone
                    });
                }

                return ListaFuncionarios;
            }

        }

    }
}